/*
 * libPDD.h
 *
 *  Created on: 25/09/2011
 *      Author: utn_so
 */

#ifndef PDD_H_
#define PDD_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <fuse.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stddef.h>
#include <stdint.h>
#include <unicode/utypes.h>
#include <unicode/ustring.h>
#include <poll.h>
#include <sys/epoll.h>
#include "config.h"
#include "sockets.h"
#include "log.h"

#define TAMSECTOR 512
#define FINARCHIVO 0xfffffff
#define NOMBRELARGO 0x0F
#define ENTRADADIR 0x10
#define ENTRADAARC 0x20
#define ENTRADABORRADA 0x2E
#define Retorno_OK 0
#define Retorno_Error 1
#define ERROR -1
#define pathCfg "/home/utn_so/Desarrollo/Workspace/PPDSincrono/Debug/config.cfg"
#define pathVolumen "/home/utn_so/fat32.disk"


/*Archivo Config */
typedef struct {
	char *modoInicio;
	char *algoritmo;
	char *pathConsola;
	char *dirIPpfs;
	char *dirIPpraid;
	int32_t puertoPFS;
	int32_t puertoPRAID;
	int32_t logActivado;
	int32_t idDisco;
	int32_t c;
	int32_t h;
	int32_t s;
	int32_t tiempoLectura;
	int32_t tiempoEscritura;
	int32_t rpm;
	int32_t tiempoSaltoPistas;
	int32_t cantConexiones;
}t_config;

char *setearCfgPPD(char *token);
int32_t stringAInt32 (char *pToken);
t_config abrirArchivoConfig();



/* Funciones PPD */
int32_t calcularDireccion(int32_t unSector);
int32_t abrirMapearArchivoDisco (char* path, char** archivoMapeado);
int32_t cerrarArchivoMapeado(char **archivoMapeado, int32_t fD);
int32_t iniciarConsola ();
int32_t leerSector(int32_t iNumeroSector,void *vDatosAretornar);
int32_t escribirSector(int32_t iNumeroSector,char *vDatosAEscribir);



/* Listas */
struct nodo
{
	int32_t datos;
	struct nodo *next;
};

typedef struct nodo t_nodo;

typedef struct{
	t_nodo *head;
}t_lista;

t_lista *crearLista();
int32_t sacarDeLaLista (t_lista *lista, int num );
void agregarEnLaLista( t_lista *lista, int32_t num, int32_t datos );
void ordenarLista (t_lista *lista, t_nodo *nodo);
t_lista *unirListas (t_lista *lista1, t_lista *lista2);



/* Planificación */
#define cantidadSectores 10

typedef struct {
	int32_t C;
	int32_t H;
	int32_t S;
} t_CHS;

typedef struct
{
	t_CHS posActual;
	int asciende;
}tCabezal;

t_CHS pasarACHS(int32_t sector);
int32_t numeroPista (int32_t sector);
int32_t planificacion (t_lista *listaPedidos);



/* Funciones Consola */
void info();
void clean (int32_t sectorInicial, int32_t sectorFinal);
void trace (int32_t *sectores);



/* Conexion PFS */
void crearPoolConexiones();
void setearFD(struct pollfd *descriptores);
void recibirPedidos(struct pollfd *descriptoresLectura);

#endif /* PDD_H_ */
